#ifndef MPOINT_H
#define MPOINT_H

#include <e32std.h>
#include <e32base.h>
#include <e32hashtab.h>
#include "rectf.h"

class CFbsBitmap;
class CGraphicsProxy;

class MPoint : public CBase
	{
private:
	TInt 					id;
    
    /*地图级对应画点的的大小*/
	static TInt 			pSizes[] = {1,1,2,2,3,3,3,3,3,3,3,3,4,4};
	
    /**点的绘制坐标 (是屏幕的决对位置)*/
    TInt 					x;
    TInt 					y;
    
	/**加密经纬度*/ 
    HBufC*					latlong;
    
    /**点的纬度*/
    double 					latitude;
    
    /**点的经度*/
    double					longitude; 
    
    /**点的地理位置名称*/
    HBufC*					name; 
    
    /**点的图片*/
    CFbsBitmap* 			mBmp;
    
    /**点的图片宽，高*/
    TInt 					bmpWidth;
    TInt					bmpHeight;
    
    /**
     * 以点为中心,图片的绘制方式：
     *                 0:图片中心与点重叠；
     *                 1:图片垂直中心底部与点重叠；
     *                 2:图片左边底部与点重叠
     */
    TInt 					mDrawMode;
    
    /**点的偏移量集合(0级-13级)；存储格式:< key: zoom ,value[]:offset>*/
    RHashMap<TInt, TPoint> 	mOffsetTable;
    
    Map* 					map;

    RectF 					rf;
    
    /**泡泡在点上的绘制方式(此变量在绘制泡泡时用)*/
    TBool 					mode;

public:
	~MPoint();
    MPoint() {};
    
    /**
     * 
     * @param zoom: 级别
     * @param offsetX: zoom级别点的偏移量X
     * @param offsetY" zoom级别点的偏移量Y
     */
    MPoint(int zoom, int offsetX, int offsetY);

    /**
     * 
     * @param zoom: 级别
     * @param offsetX: zoom级别点的偏移量X
     * @param offsetY" zoom级别点的偏移量Y
     */
    void SetOffset(int zoom,int offsetX, int offsetY);

    /**
     * 设置点的图片
     * @param bmp :点上的图片
     * @param drawMode 以点为中心,图片的绘制方式：
     *                 0:图片中心与点重叠；
     *                 1:图片垂直中心底部与点重叠；
     *                 2:图片左下角与点重叠
     *                 3:图片右下角与点重叠
     */
    void SetPointBmp(const CFbsBitmap* bmp, int drawMode) {
        
	/**
	 * 计算下一个缩放级别偏移量
	 * @param zm   当前地图缩放级别
	 * @param nzm  要计算的下一个缩放级别
	 */
	void AdjustPointOffset(int zm, int nzm);

    void DrawPoint(CGraphicsProxy& g);
    
private:
    void DrawBitmap(CGraphicsProxy& g);
    
    void DrawCircle(CGraphicsProxy& g);

public:
    TInt GetX() const;
    TInt GetY() const;
    TInt GetOffsetX(int zm) const;
    TInt GetOffsetY(int zm) const;
    
    /**
     * 泡泡在点上的绘制方式(此函数只点上绘制泡泡使用)
     * @return: true: 泡泡以"点的图片"项部相对位置绘制；
     *          false:泡泡以"点的图片"中心相对位置绘制
     */
    TBool IsBubbleMode() const;

    /**
     * 泡泡在点上的绘制方式(此函数只点上绘制泡泡使用)
     * @param mode true: 泡泡以"点的图片"项部相对位置绘制；
     *              false:泡泡以"点的图片"中心相对位置绘制
     */
    void SetBubbleMode(TBool mode);
    
    const CFbsBitmap* GetPointBmp() const;
    
    TInt GetId() const;
    
    /**
     * 获取点(MPoint)在地图上绘制的区域
     * @return RectF
     */
    const RectF& GetRectF() const;

    void SetId(int id);
    
    const TDesC& GetLatlong() const;
    
    void SetLatlong(const TDesC& latlong);
    
    TInt GetWidth() const;
    
    TInt GetHeight() const;
    
    double GetLatitude() const;

    void SetLatitude(double latitude);

    double GetLongitude() const;

    void SetLongitude(double longitude);

	const TDesC& GetName() const;

	void SetName(const TDesC& name);
    
	TBool IsClick(int x, int y) const;
	};

#endif 
